<?php
/**
* 名称：模板引擎操作对象。
* 描述：基于"Smarty模板引擎对象"的工作原理和本应用的"模板引擎配置"，构建的操作桥接对象。
*/
final class Template{
    /**
    * 描述：最后一次操作标识符。
    */
    const DISPOSE='TRYPHP_TEMPLATE_DISPOSE';

    /**
    * 描述：Smarty对象存放标量，单元素模式的，有就不在创建Smarty对象。
    */
    private static $Smarty=NULL;

    /**
    * 描述：“调用请求”嫁接函数，将"调用请求"转嫁到Smarty对象上。
    * @param string $name      调用的方法名称。
    * @param array  $arguments 调用方法给出的所有参数。
    */
    public static function __CallStatic($name,$arguments){
        #检测是否己经创建了数据库操作对象，如果没创建就创建一个。
        if(!self::$Smarty){
            $configFilePath=APP_ROOT.'/_config/template.php';
            if(!file_exists($configFilePath)){
                Error::Cast(sprintf('找不到模板引擎配置文件，路径是：%s。',$configFilePath));
            }
            $smartyConfig=include($configFilePath);                                       //获取配置。
            $smartyExtendConfig=$smartyConfig['extend'];                                  //在配置中获取扩展配置。
            unset($smartyConfig['extend']);                                               //去掉smarty不支持的扩展配置项。
            self::$Smarty=new Smarty();
            self::$Smarty->registerObject('Route',new Route(),NULL,FALSE);               //注册对象路由对象。
            foreach($smartyConfig as $option=>$value){                                    //设置smarty属性。
                  self::$Smarty->$option=$value;
            }
            foreach($smartyExtendConfig['register_object'] as $objectName=>$objectHandle){ //注册对象。
                  self::$Smarty->registerObject($objectName,$objectHandle,NULL,FALSE);
            }
        }
        #执行"请求"调用的方法，并检测"请求"是不是给了"最一次操作"的标识,给出了就释放该对象。
        $isDispose=FALSE;
        if(end($arguments)===Template::DISPOSE){
            $isDispose=TRUE;
            array_pop($arguments);
        }
        #检调方法。
        if(!method_exists(self::$Smarty,$name)){
            Error::Cast(sprintf('Smarty模板引擎没有该方法，方法名是：%s。',$name));
        }
        $value=call_user_func_array(array(self::$Smarty,$name),$arguments);
        #如果是最后一次请求，则释放该对象。
        if($isDispose===TRUE){
            self::$Smarty=NULL;
        }
        return $value;
    }
}
?>